//🧊Controller 依赖了 Service 实现业务逻辑。

import { Controller, Get, Inject, Res } from '@nestjs/common';
import { AppService } from './app.service';
import { Response } from 'express';

//2023/09/24  0:22
//单个路由的基本控制器: 只负责指挥(经理) [参数处理,方法调用]
//实现交给Service  (打工仔-> file:///E:\newking\Node\Nest\project-basis\src\app.service.ts)


@Controller()  //#controller:相当于路由 只需要被注入，所以 nest 单独给它加了 @Controller 的装饰器。
export class AppController {
  
   //1.通过构造器注入provider
   constructor(
    private readonly appService: AppService,
    @Inject('newking') private readonly newking: { name : string },
    @Inject('newfactory') private readonly newfactory: { age:number }
   ) {}



   //2.也可以通过属性注入provider
   // @Inject(AppService)
   // private readonly appService : AppService;

    @Get() //相当于路径
    getHello(): string { 
      return this.appService.getHello() + this.newking.name + this.newfactory.age;
    }
   

   //全部装饰器： https://juejin.cn/book/7226988578700525605/section/7234726536342372412?enter_from=course_center&utm_source=course_center
   
   //@Module： 声明 Nest 模块
   //@Controller：声明模块里的 controller
   //@Injectable：声明模块里可以注入的 provider
   //@Inject：通过 token 手动指定注入的 provider，token 可以是 class 或者 string 
   
   //@Optional   可选依赖声明
   //@Catch(x)   指定处理的异常(未处理异常是由ExceptionFilter对象抛出的)
   //然后通过 @UseFilters 应用到 handler 上
   //同理还有 @UseGuards/@UseInterceptor/UsePipes

   //Get('/xxx/:aaa')
   //@Query('bbb',xxxBoolPipe) 是取 url 后的 ?bbb=true
   //@Param('aaa',xxxIntPipe)  是取路径中的参数，比如 /xxx/111 种的 111

   //@Post('/xxx') 请求，可以通过 @Body 取到 body 部分
   //getHello(@Body() aaa: AaaDto) //Dto-数据传输对象,验证请求体里的参数

   //还可以用 @Put、@Delete、@Patch、@Options、@Head 装饰器分别接受 put、delete、patch、options、head 请求

   //@Redirect('https://new-king.com')   //重定向

   //@Headers('x') 装饰器取某个请求头
   //@Headers() 或者全部请求头

   //@Ip      拿到请求的 ip
   //@Session 拿到 session 对象 （需要安装一个exp中间件来设置Session: pnpm install express-session）

   //@controller 除了可以指定某些 path 生效外，还可以指定 host
   /*@Controller({ host: ':host.0.0.1', path: 'aaa' })
    export class AaaController {
        @Get('bbb')
        hello() {
            return 'hello';
        }
    } */

   //@HostParam 用于host(域名)的部分参数
   
   /**@Req|@Request 取得 request 里的全部参数
      @Get('ccc')
        ccc(@Req() req: Request){
        console.log(req.hostname,req.url)
      } 
   */
   
   /**@Res|@Response 注入 response 对象 */
   @Get('res')
   res(@Res({passthrough:true}) res: Response){
      return 'zjh';
      //return 'res';  注入response对象,就不能这样返回了,如果你不会自己返回响应,可以设置passthrough
      //而是这样返回响应
      res.end('ddd')
   }

   //当你有两个 handler 来处理同一个路由的时候，可以在第一个 handler 里注入 next，调用它来把请求转发到第二个 handler
   //@Get('eee') eee(@Next() next: NextFunction){ next(); return '111'}   //skip
   //@Get('eee') eee2(){  return '222'}   //会命中这个,默认状态码是 200
   //@HttpCode(222) 修改返回的状态码


}
